iT邦幫忙

2026 iThome 鐵人賽

DAY 12
0

今天要來講講型別斷言,當TypeScript(TS)無法確定某個值的具體型別,而開發者能夠確定它的型別時,可以透過型別斷言告訴TS這個值的型別。
型別斷言有一點需要注意:型別斷言只是「告知」TS值的型別,不會造成型別轉換,也不會改變 JavaScript執行時的資料。


型別斷言的語法

1. as

as是目前型別斷言最常見的主流寫法,具體範例如下:

//假設我們有一個unknown型別
let a: unknown = "apple"; 
//接著我們要求它的字串長度
console.log(a.length); //此時unknown會因為無法確定型別進而導致TS報錯

//因此,除了使用typeof進行型別縮小外,我們也可以透過型別斷言告訴TS,這裡的a可以視為字串:
console.log((a as string).length); //輸出:5

as的用法很簡單,使用「值 as 型別」就能告訴TS,在這個地方把這個值視為指定的型別,這樣我們就能使用該型別提供的屬性或方法。

2. <型別>

語法:<型別>變數
<型別>值也是 TypeScript 的型別斷言寫法,不過在使用JSX時會與JSX語法產生衝突,因此現在通常更推薦使用as的寫法。

//<型別>範例:
let b: unknown = "Gurifisu"; 
console.log((<string>b).length); 

型別斷言的應用:

1. unknown型別

就跟之前提到的一樣,unknown需要確定是什麼型別才能夠執行方法,使用型別斷言就能解決這個問題,之前在語法上也用unknown舉例過了,這邊就不再特別舉例了。

2. 操作 DOM 元素

當我們從DOM中取得元素時,TypeScript有時無法確定這個元素的具體型別,因此在存取特定屬性時可能會出現型別錯誤。

//實際範例:
const myInput = document.getElementById('user-email') as HTMLInputElement;
console.log(myInput.value);
//getElementById()回傳的型別是 HTMLElement | null
//但我們知道這個id對應的是<input>,因此可以透過型別斷言告訴TS把它視為 HTMLInputElement。

雙重斷言:

如果把兩個毫無關聯的變數進行型別斷言,TS會阻止你做蠢事

let x: string = "000";
let y = x as number; //TS的型別斷言有相容性限制,某些型別不能直接進行斷言。
console.log(y); // "000"
console.log(typeof y); // "string"

如果真的要把字串轉成數字,應該使用Number()parseInt()等方式進行實際的資料轉換,而不是使用型別斷言。雙重斷言的用途並不是進行型別轉換,而是當TypeScript的型別相容性檢查阻止直接斷言時,先透過unknownany再斷言成目標型別。

let x: string = "000";
let y = (x as unknown) as number;

這邊還是提醒一下,雖然看上去雙重斷言很好用,但跟any一樣還是少用為好,雙重斷言如果判斷錯誤,就可能在執行時發生問題。


小結

今天簡單介紹了型別斷言是什麼?還有在什麼場合能夠使用?結合上一篇的unknown型別,希望大家能夠快速上手型別斷言的應用!


上一篇
[Day-11]TypeScript的特殊型別
下一篇
[Day-13]型別收窄(Type Narrowing)
系列文
從零開始學習TypeScript:菜鳥的入門介紹與概覽22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言